#include "Queue.h"

void QueueNoteInit(po*q)//初始化
{
    assert(q);
    q->First=NULL;
    q->Tail=NULL;
}

void QueueNotePush(po*q,Value x)//插入
{
    assert(q);
    QET*ptr=(QET*)malloc(sizeof(QET));
    if(ptr==NULL)
    {
        perror("ptr:");
    }
    ptr->data=x;

   if(q->First==NULL&&q->Tail==NULL)
   {
       q->First=q->Tail=ptr;
   }
   else
    {
        q->Tail->next=ptr;
        q->Tail=ptr;
    }
}


Value QueueFront(po* q)//头部数据
{
    assert(q);
    return q->First->data;
}

Value QueueBack(po* q)//尾部
{
    assert(q);
    return q->Tail->data;
}

int QueueSize(po* q)//队列内元素个数
{
    assert(q);
    if(QueueEmpty(q)==1)
    {
        return 0;
    }

    QET *cur=q->First;
    int count=0;
    while(cur!=q->Tail->next)
    {
        ++count;
        cur=cur->next;
    }
    return count;
}



bool QueueEmpty(po* q)
{
    assert(q);

    return q->Tail==NULL;
}

void QueuePop(po* q)// 队头出队列
{
    assert(q);
    if(!QueueEmpty(q))
    {

        QET *Next=q->First->next;
        QET*Head=q->First;
        q->First=Next;
        if(q->First==NULL)
        {
            q->Tail=NULL;
        }
//      free(Head);
//      Head=NULL;
    }

}

// 销毁队列
void QueueDestroy(po* q)
{
    assert(q);
    if(QueueEmpty(q))
    {
        return;
    }
    QET*cur=q->First;
    while(cur!=q->Tail->next)
    {
        QET *Next=cur->next;
        free(cur);
        cur=Next;
    }
    q->Tail=NULL;
    q->First=NULL;

}